/**
 * 工作时间判断工具类
 * 用于判断当前时间是否为工作时间
 */
class WorkingTimeHelper {
  constructor() {
    // 工作日配置 (1=周一, 2=周二, ..., 7=周日)
    this.workingDays = [1, 2, 3, 4, 5]; // 默认周一到周五
    
    // 工作时间段配置 (24小时制)
    this.workingHours = {
      start: 9,  // 上午9点开始
      end: 18    // 下午6点结束
    };
    
    // 节假日配置 (可以从配置文件或数据库读取)
    this.holidays = [
      // 示例：'2024-01-01', '2024-02-10' 等
    ];
  }

  /**
   * 判断指定时间是否为工作时间
   * @param {Date} date 要判断的时间，默认为当前时间
   * @returns {boolean} 是否为工作时间
   */
  isWorkingTime(date = new Date()) {
    // 检查是否为工作日
    if (!this.isWorkingDay(date)) {
      return false;
    }

    // 检查是否在工作时间段内
    if (!this.isWorkingHour(date)) {
      return false;
    }

    // 检查是否为节假日
    if (this.isHoliday(date)) {
      return false;
    }

    return true;
  }

  /**
   * 判断是否为工作日
   * @param {Date} date 要判断的日期
   * @returns {boolean} 是否为工作日
   */
  isWorkingDay(date) {
    const dayOfWeek = date.getDay(); // 0=周日, 1=周一, ..., 6=周六
    const adjustedDay = dayOfWeek === 0 ? 7 : dayOfWeek; // 转换为1-7格式
    return this.workingDays.includes(adjustedDay);
  }

  /**
   * 判断是否在工作时间段内
   * @param {Date} date 要判断的时间
   * @returns {boolean} 是否在工作时间段内
   */
  isWorkingHour(date) {
    const hour = date.getHours();
    return hour >= this.workingHours.start && hour < this.workingHours.end;
  }

  /**
   * 判断是否为节假日
   * @param {Date} date 要判断的日期
   * @returns {boolean} 是否为节假日
   */
  isHoliday(date) {
    const dateString = this.formatDate(date);
    return this.holidays.includes(dateString);
  }

  /**
   * 格式化日期为YYYY-MM-DD格式
   * @param {Date} date 日期对象
   * @returns {string} 格式化后的日期字符串
   */
  formatDate(date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
  }

  /**
   * 计算自动发布时间（休息时间发布后30分钟）
   * @param {Date} publishTime 发布时间，默认为当前时间
   * @returns {Date} 自动发布时间
   * 注意:由于数据库存储UTC时间,这里也返回UTC时间以保持一致
   */
  calculateAutoPublishTime(publishTime = new Date()) {
    // 创建一个新的Date对象,避免修改原对象
    const autoPublishTime = new Date(publishTime.getTime() + 30 * 60 * 1000);
    return autoPublishTime;
  }

  /**
   * 设置工作日
   * @param {number[]} workingDays 工作日数组 (1-7)
   */
  setWorkingDays(workingDays) {
    this.workingDays = workingDays;
  }

  /**
   * 设置工作时间
   * @param {number} startHour 开始小时
   * @param {number} endHour 结束小时
   */
  setWorkingHours(startHour, endHour) {
    this.workingHours = {
      start: startHour,
      end: endHour
    };
  }

  /**
   * 设置节假日
   * @param {string[]} holidays 节假日数组 (YYYY-MM-DD格式)
   */
  setHolidays(holidays) {
    this.holidays = holidays;
  }

  /**
   * 添加节假日
   * @param {string} holiday 节假日 (YYYY-MM-DD格式)
   */
  addHoliday(holiday) {
    if (!this.holidays.includes(holiday)) {
      this.holidays.push(holiday);
    }
  }

  /**
   * 移除节假日
   * @param {string} holiday 节假日 (YYYY-MM-DD格式)
   */
  removeHoliday(holiday) {
    const index = this.holidays.indexOf(holiday);
    if (index > -1) {
      this.holidays.splice(index, 1);
    }
  }

  /**
   * 获取当前配置信息
   * @returns {Object} 配置信息
   */
  getConfig() {
    return {
      workingDays: this.workingDays,
      workingHours: this.workingHours,
      holidays: this.holidays
    };
  }
}

// 创建单例实例
const workingTimeHelper = new WorkingTimeHelper();

module.exports = {
  WorkingTimeHelper,
  workingTimeHelper
};
